package com.example.lettcode._202412._20241211;

import java.util.Arrays;
import java.util.List;

/*
345. 反转字符串中的元音字母
给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。

示例 1：
输入：s = "IceCreAm"
输出："AceCreIm"
解释：
s 中的元音是 ['I', 'e', 'e', 'A']。反转这些元音，s 变为 "AceCreIm".

示例 2：
输入：s = "leetcode"
输出："leotcede"

提示：
1 <= s.length <= 3 * 105
s 由 可打印的 ASCII 字符组成
 */
public class _345_fan_zhuan_yuan_yin_zi_mu {

    public static void main(String[] args) {
        String iceCreAm = reverseVowels2("leetcode");
        System.out.println(iceCreAm);
    }

    public static String reverseVowels(String s) {
        List<Character> list = Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');

        char[] chars = s.toCharArray();
        int l = 0;
        int r = s.length() - 1;
        while (l < r) {
            while (!list.contains(s.charAt(l))) {
                if (l == r) break;
                l++;
            }

            while (!list.contains(s.charAt(r))) {
                if (l == r) break;
                r--;
            }
            // if (chars[l] == chars[r]) {
            //     continue;
            // }

            char temp = chars[l];
            chars[l] = chars[r];
            chars[r] = temp;
            l++;
            r--;
        }

        StringBuilder builder = new StringBuilder();
        for (char aChar : chars) {
            builder.append(aChar);
        }
        return builder.toString();
    }


    public static String reverseVowels2(String s) {
        List<Character> list = Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');
        char[] chars = s.toCharArray();
        int l = 0;
        int r = chars.length - 1;
        while (l < r) {
            if (list.contains(chars[l])) {
                while (!list.contains(chars[r])) {
                    if (r == l) break;
                    r--;
                }
                char temp = chars[l];
                chars[l] = chars[r];
                chars[r] = temp;
                l++;
                r--;
            } else {
                l++;
            }

        }

        return new String(chars);
    }

    public static String reverseVowels3(String s) {
        char[] chars = s.toCharArray();
        int l = 0;
        int r = chars.length - 1;
        while (l < r) {
            if (isVowel(chars[l])) {
                while (!isVowel(chars[r])) {
                    if (r == l) break;
                    r--;
                }
                char temp = chars[l];
                chars[l] = chars[r];
                chars[r] = temp;
                l++;
                r--;
            } else {
                l++;
            }

        }
        return new String(chars);
    }

    private static boolean isVowel(char c) {
        return "aeiouAEIOU".indexOf(c) > 0;
    }
}
